\documentclass[12pt,titlepage]{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}

\usepackage{color}
\usepackage{graphicx} % para insertar imagenes
\usepackage{verbatim}

\newcommand{\VSP}{\vspace*{3em}}
\newcommand{\Pa}{\vspace{5mm}}

\title{{\sc\normalsize Sistemas Operativos}\\{\bf Trabajo Práctico Nº3\\ \Pa} {\texttt Grupo 12}}
\author{\begin{tabular}{lcr}
Carla Livorno & 424/08 & carlalivorno@hotmail.com\\Thomas Fischer & 489/08 & tfischer@dc.uba.ar
\end{tabular}}
\date{\VSP \normalsize{Noviembre 2010}}
%\date{}
\begin{document}
\begin{titlepage}
\maketitle
\end{titlepage}
\newpage

	\begin{section}{Introducción}
		El objetivo de este trabajo es implementar un algoritmo de exclusión mutua 
		en sistemas distribuidos.
		El algoritmo en cuestion es el de Ricart Agrawala, el cual provee una
		solución óptima a dicho problema.
	\end{section}

	\begin{section}{Algoritmo}
		El algoritmo funciona de la siguiente manera. Cada nodo, o cliente que 
		desea acceder a la seccion crítica, tiene asociado un proceso servidor 
		dedicado, que se encarga de sincronizar el acceso a la sección crítica 
		con los demas nodos, comunicandose con sus respectivos servidores. \\

		Cuando un cliente requiere acceso a la sección crítica, simplemente 
		le avisa a su servidor y se queda esperando hasta que este se lo conceda.

		Por su lado el servidor, va a enviar a todos los servidores de nodos 
		existentes, un mensaje pidiendo el acceso exclusivo, y va a esperar 
		hasta que cada uno de ellos le conteste (el número de nodos es conocido 
		por el programa). \\

		Las condiciones de carrera surgen cuando dos nodos quieren acceder a la
		sección crítica de manera casi simultánea, en cuyo caso a un proceso que
		esta esperando todas las confirmaciónes para usar la sección crítica,
		también le pueden llegar mensajes de pedido.

		Acá el programa necesita tomar una decisión para no causar un 
		estancamiento en el flujo. Si tiene prioridad para obtener la sección crítica
		ignora el pedido (en realidad lo marca como pendiente,
		ya que luego de liberarse le va a responder),
		y sigue esperando que todos los nodos respondan a su pedido,
		o responde garantizandole acceso al otro nodo. \\

		Para tomar esta decisión, cada proceso conoce a un valor que llamamos
		\texttt{número de secuencia} que indica la prioridad de acceso.
		Cuanto más bajo el valor, más prioritario es el acceso. Luego, cuando un
		proceso necesita el acceso, incrementa el máximo 
		\texttt{número de secuencia} conocido (por él) y este pasa a ser su 
		prioridad. Este valor idealmente debería estar compartido entre todos los
		nodos, pero como estamos tratando con un sistema distribuído debemos
		sincronizarlo mediante mensajes entre ellos.
		Lo que hacemos en este caso es informar a los otros procesos el
		\texttt{número de secuencia} en el mismo mensaje con el que
		hacemos el pedido de la sección crítica. Así, cada servidor sabe
		evaluar la prioridad y tomar la decisión antes mencionada. \\

		Como se pueden dar casos de empate entre el
		\texttt{número de secuencia} de distintos procesos, por un tema de
		sincronización, desempatamos dándole prioridad a aquel nodo con menor
		\texttt{número de proceso}. Este número es un identificador único
		asignado al momento de crear los distintos procesos.
		
		Cuando un nodo libera la sección crítica responde los pedidos que tuvo del resto de los nodos
		para obtenerla, los cuales ignoro porque tenian menor prioridad.
	\end{section}
	
	\begin{section}{Implementación}
		Se implementó el algoritmo descripto en la sección anterior
		utilizando la librería MPI.
		La misma provee una interface para trabajar con procesos
		distribuídos, facilitando el envío de mensajes entre los mismos.
		Provee funciones de Envío (Send) y recepción (Recv) asi como
		el conjunto de los procesos ejecutandose en el sistema
		distribuído.
		
		Cuando se ejecuta un proceso, dependiendo de la paridad del
		número del mismo, va a ejecutar código de cliente
		o de servidor (MPI asigna incrementalmente un número de proceso
		único dentro del communicator global cada vez que ejecuta
		uno nuevo).
	\end{section}
	
\end{document}
